package linker;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
import com.microsoft.sqlserver.jdbc.SQLServerException;

import linker.CONFIGSQL;

public class LinkerSQL {

	private static Connection connection = null;
	
	/**
	 * Ejecuta un comando de SQL.
	 * @param command = Comando a ejecutar en el servidor sql.
	 * @return Resultado del comando ejecutado. null si dio error.
	 */
	public static ResultSet runCommand(String command) {
		//System.out.println("Corriendo comando.");
		Statement st;
		ResultSet rs = null;
		try { 
			st = getConnection().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
			//System.out.println("Ejecutando querie.");
			rs = st.executeQuery(command);
			//System.out.println("Querie ejecutado.");
		} catch (SQLException e) {
			rs = null;
			e.printStackTrace();
		}
		//System.out.println("Comando corrido.");
		return rs;
	}
	
	/**
	 * Ejecuta un SP con argumentos.
	 * @param sp = SP a ejecutar.
	 * @param arguments = Argumentos del SP a ejecutar.
	 * @return Resultado del SP ejecutado. null si dio error.
	 */
	public static ResultSet runSP(String sp, String... arguments) {
		ResultSet rs = null;
		String aux = "{call dbo." + sp + "(";
		
		for (int i = 0; i < (arguments.length - 1); i++) {
			aux += arguments[i] + ", ";
		}
		
		aux += arguments[arguments.length - 1] + ")}";
		try {
			PreparedStatement st = getConnection().prepareStatement(aux);
			rs = st.executeQuery();
		} catch (SQLException e) {
			rs = null;
			e.printStackTrace();
		}
		return rs;
	}	
	
	/**
	 * Ejecuta un SP sin argumentos.
	 * @param sp = SP a ejecutar.
	 * @return Resultado del SP ejecutado. null si dio error.
	 */
	public static ResultSet runSP(String sp) {
		ResultSet rs = null;
		String aux = "{call dbo." + sp + "}";
		try {
			PreparedStatement st = getConnection().prepareStatement(aux);
			rs = st.executeQuery();
		} catch (SQLException e) {
			rs = null;
			e.printStackTrace();
		}
		return rs;
	}
	
	/**
	 * Devuelve la conexion activa a la base de datos.
	 * @return Conexion a la base de datos. Unica para la ejecucion del programa.
	 */
	private static Connection getConnection() {
		if (connection == null) createConnection();
		
		return connection;
	}

	/**
	 * Crea una conexion a una base de datos.
	 *  null si dio error.
	 */
	private static void createConnection() {
		try {
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("PIIIINCHAAAAA");
			e.printStackTrace();
		}
		
		SQLServerDataSource ds = new SQLServerDataSource();
		ds.setUser(CONFIGSQL.getUser());
		ds.setPassword(CONFIGSQL.getPass());
		ds.setServerName(CONFIGSQL.getServerName());
		ds.setPortNumber(CONFIGSQL.getPort()); 
		ds.setDatabaseName(CONFIGSQL.getDatabaseName());
		try {
			connection = ds.getConnection();
		} catch (SQLServerException e) {
			connection = null;
			System.out.println("error de conexion");
		}
		//System.out.println("Conexion creada.");
	}
}
